package cn.rokhdelar.ams.business.biz.projectbaseflow;

import cn.rokhdelar.ams.business.biz.projectbaseflow.domain.AuditRecord;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 保存审核意见与节点处理记录的监听器
 */
public class SaveAuditListener implements TaskListener {

    // 可选：通过表达式指定额外参数（如审核类型，非必需）
    private Expression auditType;

    @Override
    public void notify(DelegateTask delegateTask) {
        try {
            // 1. 获取当前任务的核心信息（用于关联节点处理记录）
            String taskId = delegateTask.getId(); // 任务实例ID（唯一标识本次节点处理）
            String taskDefKey = delegateTask.getTaskDefinitionKey(); // 节点定义ID（如"managerAudit"）
            String processInstanceId = delegateTask.getProcessInstanceId(); // 流程实例ID
            String assignee = delegateTask.getAssignee(); // 审核人
            Date auditTime = new Date(); // 审核时间

            // 2. 获取表单提交的审核数据（对应formField中定义的id）
            String auditResult = (String) delegateTask.getVariable("auditResult"); // 审核结果（pass/reject）
            String auditComment = (String) delegateTask.getVariable("auditComment"); // 审核意见

            // 3. 构建审核记录对象（可自定义实体类存储详细信息）
            AuditRecord auditRecord = new AuditRecord();
            auditRecord.setTaskId(taskId);
            auditRecord.setTaskDefKey(taskDefKey);
            auditRecord.setProcessInstanceId(processInstanceId);
            auditRecord.setAuditor(assignee);
            auditRecord.setAuditTime(auditTime);
            auditRecord.setAuditResult(auditResult);
            auditRecord.setAuditComment(auditComment);
            // 可选：设置审核类型（通过表达式传入）
            if (auditType != null) {
                auditRecord.setAuditType(auditType.getValue(delegateTask).toString());
            }

            // 4. 存储审核记录（两种方式可选）
            // 方式一：存入流程变量（适合临时存储，随流程实例生命周期存在）
            List<AuditRecord> auditRecords =   delegateTask.hasVariable("auditRecords") ?
                    (List<AuditRecord>) delegateTask.getVariable("auditRecords") :
                    new ArrayList<>();
            auditRecords.add(auditRecord);
            delegateTask.setVariable("auditRecords", auditRecords);

            // 方式二：存入数据库（适合长期保存，需自定义DAO层）
            // auditRecordMapper.insert(auditRecord); // 需自行实现MyBatis/JPA的持久化逻辑

        } catch (Exception e) {
            // 异常处理：避免监听器报错导致任务提交失败
            throw new RuntimeException("保存审核记录失败：" + e.getMessage(), e);
        }
    }

    // getter/setter（若使用表达式参数auditType，需提供setter）
    public void setAuditType(Expression auditType) {
        this.auditType = auditType;
    }
}